package zhongbo.java.air.monitor.util;

import org.locationtech.jts.geom.*;

/**
 * 说明：
 * jts工具类
 *
 * @author 钟波dellNotebook
 * @since 2025年04月09日 星期三 06:22:34
 */
public class JtsUtil {


    private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();


    /**
     * 创建一个点
     *
     * @param lon 经度
     * @param lat 纬度
     * @return 创建的点
     */
    public static Point createPoint(double lon, double lat) {
        return GEOMETRY_FACTORY.createPoint(createCoordinate(lon, lat));
    }

    /**
     * 创建一个多边形
     *
     * @param coordinates 多边形的顶点坐标数组
     * @return 创建的多边形
     */
    public static Polygon createPolygon(Coordinate[] coordinates) {
        return GEOMETRY_FACTORY.createPolygon(coordinates);
    }

    /**
     * 判断一个点是否在多边形内
     *
     * @param point   待判断的点
     * @param polygon 多边形
     * @return 如果点在多边形内，则返回true，否则返回false
     */
    public static boolean isPointInPolygon(Point point, Polygon polygon) {
        return point.within(polygon);
    }


    /**
     * 计算两个几何对象的交集
     *
     * @param geometry1 几何对象1
     * @param geometry2 几何对象2
     * @return 两个几何对象的交集
     */
    public static Geometry intersection(Geometry geometry1, Geometry geometry2) {
        return geometry1.intersection(geometry2);
    }

    /**
     * 计算几何对象的面积
     *
     * @param geometry 几何对象
     * @return 几何对象的面积
     */
    public static double calculateArea(Geometry geometry) {
        return geometry.getArea();
    }

    /**
     * 计算几何对象的长度
     *
     * @param geometry 几何对象
     * @return 几何对象的长度
     */
    public static double calculateLength(Geometry geometry) {
        return geometry.getLength();
    }


    /**
     * 创建一个坐标点
     *
     * @param lon 经度
     * @param lat 纬度
     * @return 创建的坐标点
     */
    public static Coordinate createCoordinate(double lon, double lat) {
        return new Coordinate(lon, lat);
    }

    // 其他常用功能可以在这里继续添加
    // 示例：使用方法创建一个点和一个多边形
    public static void main(String[] args) {
        // 创建坐标点
        Coordinate coordinate = createCoordinate(116.391275, 39.90765);

        // 创建点
        Point point = createPoint(116.391275, 39.90765);

        // 创建多边形的顶点坐标数组
        Coordinate[] polygonCoordinates = new Coordinate[]{
                createCoordinate(116.391275, 39.90765),
                createCoordinate(116.3955, 39.90765),
                createCoordinate(116.3955, 39.91065),
                createCoordinate(116.391275, 39.91065),
                createCoordinate(116.391275, 39.90765) // 闭合多边形
        };

        // 创建多边形
        Polygon polygon = createPolygon(polygonCoordinates);

        // 判断点是否在多边形内
        boolean isInside = isPointInPolygon(point, polygon);
        System.out.println("Is the point inside the polygon? " + isInside);
    }
}